package com.Book.test_1_25_springmvcbook.interceptor;

import com.Book.test_1_25_springmvcbook.constant.Constant;
import com.Book.test_1_25_springmvcbook.model.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    // 登录的一个拦截器
    // 要实现一个拦截器, 需要有 一个接口 HandlerInterceptor
    // 这个接口里面有三个方法
    // 分别为
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //return HandlerInterceptor.super.preHandle(request, response, handler);
        // 这个方法的意思是: 在处理之前处理的内容, 指的是目标方法 执行前执行
        // 返回一个 boolean 类型
        // 如果返回 true 表示 继续后续操作 表示放行
        // 如果 返回 false 表示拦截成功  表示拦截

        // 测试一下
        // 让其先进行放行
//        log.info("目标方法执行前");
//        return true;

        // 接下来正式使用拦截器
        log.info("登录拦截器校验....");

        // 把要拦截的代码添加进来
        //校验用户是否登录

        // 方法一:
//        HttpSession session = request.getSession(false); // 先去获取 session
//        if(session != null && session.getAttribute(Constant.SESSION_USER_KEY) != null){
//            UserInfo userInfo = (UserInfo) session.getAttribute(Constant.SESSION_USER_KEY); // 得到用户输入的值
//            // 并判断输入的值是否为 null
//            if(userInfo != null && userInfo.getId() >= 0){
//                return true;
//            }
//            // 判断不为 null , 如果为 null 就返回 false
//            return true;
//        }

        // 方法二:
        HttpSession session = request.getSession(true);
        UserInfo userInfo = (UserInfo) session.getAttribute(Constant.SESSION_USER_KEY);
        // 并判断输入的值是否为 null
        if(userInfo != null && userInfo.getId() >= 0){
            return true;
        }

        // 如果是拦截成功了
        // 就可以设置一些状态码
        response.setStatus(401); // 401 表示未认证登录 // 这个表示 HTTP的状态码
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
        // 这个方法表示 目标方法执行后执行

        // 整个目标方法执行完之后
        // 就是对方法的一个评价

        // 测试一下
        log.info("目标方法执行后");
    }

//    @Override
//    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
//        // 这个方法是指目标视图渲染后执行
//    }


}
